/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.brain.segu.mbean;

import com.brain.core.common.UtilCore;
import com.brain.core.dto.EmpresaDto;

import com.brain.core.exception.DAOException;
import com.brain.core.manager.BitacoraManager;
import com.brain.core.manager.EmpresaManager;
import com.brain.core.manager.RecursosManager;

import com.brain.core.view.mbean.ApplicationMBean;
import com.brain.core.view.mbean.GenericMBean;
import com.brain.core.view.mbean.SessionMBean;

import com.brain.segu.dto.OpcionSistemaDto;
import com.brain.segu.dto.PermisoRolDto;
import com.brain.segu.dto.RolDto;
import com.brain.segu.dto.UsuarioDto;
import com.brain.segu.manager.OpcionSistemaManager;
import com.brain.segu.manager.PermisoRolManager;
import com.brain.segu.manager.RolManager;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.primefaces.model.DefaultTreeNode;
import org.primefaces.model.TreeNode;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

/**
 *
 * @author Indra
 */
@Controller("rolMBean")
@Scope("session")
public class RolMBean extends GenericMBean implements Serializable {

    private static Logger logger = Logger.getLogger(RolMBean.class);
    @Resource
    private RolManager manager;
    @Resource
    private EmpresaManager empresaManager;
    @Resource
    private BitacoraManager bitacoraManager;
    @Resource
    private OpcionSistemaManager managerOS;
    @Resource
    private PermisoRolManager managerPermiso;
    @Resource
    private RecursosManager recursosManager;
    @Autowired
    private ApplicationMBean applicationMBean;
    @Autowired
    private SessionMBean sessionMBean;
    private List<RolDto> lista;
    private RolDto dto;
    private RolDto dtoFiltro;
    private String keyEntidad = "key.entidad.rol";
    private List<PermisoRolDto> listaPermisos;
    private TreeNode permisos;
    private TreeNode selectedOpcion;
    private OpcionSistemaDto osPrincipal;
    private OpcionSistemaDto osSeleccionado;

    public RolMBean() {

        this.dtoFiltro = new RolDto();
    }

    public String iniciar() {
        this.lista = null;
        this.dto = null;
        this.dtoFiltro = new RolDto();
        this.dtoFiltro.setDescripcion("");
        this.dtoFiltro.setActivo(Boolean.TRUE);
        return manager.getUrlListaRoles();
    }

    private TreeNode cargarOpcionesSistema(OpcionSistemaDto osPrincipal) throws DAOException {
        TreeNode nodoDefecto = new DefaultTreeNode(new PermisoRolDto(), null);
        TreeNode nodoInicial = new DefaultTreeNode(osPrincipal, nodoDefecto);
        nodoInicial.setExpanded(true);
        recursividadArbol(nodoInicial);
        return nodoDefecto;
    }

    TreeNode recursividadArbol(TreeNode tree) throws DAOException {
        OpcionSistemaDto inicial = (OpcionSistemaDto) tree.getData();
        List<OpcionSistemaDto> hijos = managerOS.obtenerListaHijosPorEmpresa(inicial.getId(), this.dto);
        //List<OpcionSistemaDto> hijos = inicial.getListaHijos();
        UtilCore.General.ordena(hijos, "descripcion");
        if (hijos != null && !hijos.isEmpty()) { //tiene hijos            
            for (OpcionSistemaDto x : hijos) {
                if (obtenerPermisoRol(x) != null) {
                    x.setPermiso(obtenerPermisoRol(x).getEstado());
                }
                TreeNode t1 = new DefaultTreeNode(x, tree);
                t1.setExpanded(true);
                recursividadArbol(t1);
            }
        }
        return null;
    }

    private PermisoRolDto obtenerPermisoRol(OpcionSistemaDto os) {
        PermisoRolDto p = null;
        for (PermisoRolDto x : this.listaPermisos) {
            if (x.getOpcionSistemaDto().getId().equals(os.getId())) {
                p = x;
                break;
            }
        }
        return p;
    }

    public String nuevo() {
        sessionMBean.setAccion(applicationMBean.getNuevo());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));
        this.dto = new RolDto();
        this.dto.setActivo(Boolean.TRUE);
        this.dto.setEmpresa(sessionMBean.getEmpresaDto().getId());
        this.dto.setUsuarioDefault(Boolean.FALSE);
        this.dto.setIsEmpleado(Boolean.FALSE);
        this.permisos = null;
        return manager.getUrlRol();
    }

    public String editar() {
        sessionMBean.setAccion(applicationMBean.getEditar());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));

        try {
            this.listaPermisos = managerPermiso.permisosPorRol(this.dto.getId());
            this.osPrincipal = managerOS.obtenerPorId(0L);
            this.osPrincipal.setPermiso(obtenerPermisoRol(osPrincipal).getEstado());
            this.permisos = cargarOpcionesSistema(this.osPrincipal);

        } catch (DAOException ex) {
            logger.error(ex);
        }

        return manager.getUrlRol();
    }

    public String ver() {
        sessionMBean.setAccion(applicationMBean.getVer());
        sessionMBean.setTitulo(recursosManager.construirTitulo(keyEntidad, sessionMBean.getAccion()));

        try {
            this.listaPermisos = managerPermiso.permisosPorRol(this.dto.getId());
            this.osPrincipal = managerOS.obtenerPorId(0L);
            this.osPrincipal.setPermiso(obtenerPermisoRol(osPrincipal).getEstado());
            this.permisos = cargarOpcionesSistema(this.osPrincipal);

        } catch (DAOException ex) {
            logger.error(ex);
        }
        return manager.getUrlRol();
    }

    public void buscar() {
        try {
            this.lista = this.manager.obtener(this.dtoFiltro);
            for (RolDto r : this.lista) {
                if (r.getEmpresa() != null) {
                    EmpresaDto empDto = empresaManager.obtenerPorId(r.getEmpresa());
                    r.setEmpresaTexto(empDto.getDescripcion());
                } else {
                    r.setEmpresaTexto("");
                }

            }
        } catch (DAOException ex) {
            showError("ERROR_SISTEMA", ex.getMessage());
        }
    }

    public void cambiarEstado() {
        this.osSeleccionado = (OpcionSistemaDto) this.selectedOpcion.getData();
        if (!osSeleccionado.getId().equals(0L)) {
            this.osSeleccionado.setPermiso(!this.osSeleccionado.getPermiso());
        }
        PermisoRolDto p = obtenerPermisoRol(this.osSeleccionado);
        try {
            p.setEstado(this.osSeleccionado.getPermiso());
            this.managerPermiso.editar(p);
            sessionMBean.getPrincipalMenuBar();
        } catch (DAOException ex) {
            logger.error(ex);
        }
    }

    public String guardar() {

        try {
            if (manager.guardar(this.dto) != null) {
                this.listaPermisos = managerPermiso.permisosPorRol(this.dto.getId());
                this.osPrincipal = managerOS.obtenerPorId(0L);
                this.osPrincipal.setPermiso(obtenerPermisoRol(osPrincipal).getEstado());
                this.permisos = cargarOpcionesSistema(this.osPrincipal);
            }
        } catch (Exception ex) {
            logger.error(ex);
        }

        return null;
    }

    public List<RolDto> autoCompletarRol(String query) {
        List<RolDto> results = null;
        try {
            results = manager.autoCompletarRolPorEmpresa(query);
        } catch (DAOException ex) {
            logger.error(ex);
            results = new ArrayList<RolDto>();
        }
        return results;
    }

    public String verBitacora() {

        bitacoraManager.cargarBitacoraEntidad(manager.getIdEntidad(), this.dto.getId());
        return null;
    }

    public String retroceder() {
        buscar();
        return manager.getUrlListaRoles();
    }

    public ApplicationMBean getApplicationMBean() {
        return applicationMBean;
    }

    public void setApplicationMBean(ApplicationMBean applicationMBean) {
        this.applicationMBean = applicationMBean;
    }

    public RolDto getDto() {
        return dto;
    }

    public void setDto(RolDto dto) {
        this.dto = dto;
    }

    public String getKeyTitulo() {
        return keyEntidad;
    }

    public void setKeyTitulo(String keyEntidad) {
        this.keyEntidad = keyEntidad;
    }

    public List<RolDto> getLista() {
        return lista;
    }

    public void setLista(List<RolDto> lista) {
        this.lista = lista;
    }

    public static Logger getLogger() {
        return logger;
    }

    public static void setLogger(Logger logger) {
        RolMBean.logger = logger;
    }

    public RolManager getManager() {
        return manager;
    }

    public void setManager(RolManager manager) {
        this.manager = manager;
    }

    public RecursosManager getRecursosManager() {
        return recursosManager;
    }

    public void setRecursosManager(RecursosManager recursosManager) {
        this.recursosManager = recursosManager;
    }

    public SessionMBean getSessionMBean() {
        return sessionMBean;
    }

    public void setSessionMBean(SessionMBean sessionMBean) {
        this.sessionMBean = sessionMBean;
    }

    public RolDto getDtoFiltro() {
        return dtoFiltro;
    }

    public void setDtoFiltro(RolDto dtoFiltro) {
        this.dtoFiltro = dtoFiltro;
    }

    public List<PermisoRolDto> getListaPermisos() {
        return listaPermisos;
    }

    public void setListaPermisos(List<PermisoRolDto> listaPermisos) {
        this.listaPermisos = listaPermisos;
    }

    public OpcionSistemaManager getManagerOS() {
        return managerOS;
    }

    public void setManagerOS(OpcionSistemaManager managerOS) {
        this.managerOS = managerOS;
    }

    public PermisoRolManager getManagerPermiso() {
        return managerPermiso;
    }

    public void setManagerPermiso(PermisoRolManager managerPermiso) {
        this.managerPermiso = managerPermiso;
    }

    public OpcionSistemaDto getOsPrincipal() {
        return osPrincipal;
    }

    public void setOsPrincipal(OpcionSistemaDto osPrincipal) {
        this.osPrincipal = osPrincipal;
    }

    public TreeNode getPermisos() {
        return permisos;
    }

    public void setPermisos(TreeNode permisos) {
        this.permisos = permisos;
    }

    public TreeNode getSelectedOpcion() {
        return selectedOpcion;
    }

    public void setSelectedOpcion(TreeNode selectedOpcion) {
        this.selectedOpcion = selectedOpcion;
    }

    public OpcionSistemaDto getOsSeleccionado() {
        return osSeleccionado;
    }

    public void setOsSeleccionado(OpcionSistemaDto osSeleccionado) {
        this.osSeleccionado = osSeleccionado;
    }
}
